package de.akabahn.ebd.stw.zdxfc.prs.tco.elemente;

import static de.akabahn.ebd.stw.zdxfc.prs.tco.ZDXFCTcoConstants.WINDOW_SIZE_WIDTH;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;

import de.akabahn.ebd.stw.zdxfc.prs.tco.ZDXFCTcoMain;

/**
 * Sammlung aller statischen Elemente auf dem TCO, deren Lage oder Farbe sich nicht
 * aendert.
 *    
 * @author Peter Eimann
 * @since 1.0
 * @version 1.1
 */
public class StatischeElemente {

	private ZDXFCTcoMain main;
	
	/**
	 * Initialisierung der Klasse
	 * 
	 * @param main Referenz auf die Hauptklasse
	 */
	public StatischeElemente(ZDXFCTcoMain main) {
		this.main = main;
	}

	/**
	 * Zeichnen aller statischen Elemente auf dem TCO
	 * 
	 * @param g Der Grafik-Kontext
	 * @see #zeichneStatischeGleisElemente(Graphics)
	 * @see #zeichneStatischeWeichenElemente(Graphics)
	 * @see #zeichneChevrons(Graphics)
	 * @see #zeichneStatischeTexte(Graphics)
	 * @see #zeichneBahnsteige(Graphics)
	 * @see #zeichneExtraLinieCv12(Graphics)
	 */
	public void paint(Graphics g) {
		zeichneStatischeGleisElemente(g);
		zeichneStatischeWeichenElemente(g);
		zeichneChevrons(g);
		zeichneStatischeTexte(g);
		zeichneBahnsteige(g);
		zeichneExtraLinieCv12(g);
	}

	/**
	 * Zeichnen der statischen Gleiselemente (Gleisnummer und eingekreister Fahrstrassenbuchstabe)
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneStatischeGleisElemente(Graphics g) {
		g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 12));
		g.setColor(Color.BLACK);
		
		// Voie 2bis
		g.drawString("V2bis", 30, 105);
		g.drawString("L", 146, 105);
		g.drawOval(140, 91, 18, 18);
		// Voie 2
		g.drawString("V2", 520, 105);
		g.drawString("F", 545, 105);
		g.drawOval(539, 91, 18, 18);
		// Voie 2ter
		g.drawString("V2ter", 875, 105);
		g.drawString("D", 825, 105);
		g.drawOval(820, 91, 18, 18);
		// Voie 1bis
		g.drawString("V1bis", 30, 155);
		g.drawString("M", 145, 155);
		g.drawOval(140, 141, 18, 18);
		// Voie 1
		g.drawString("V1", 520, 155);
		g.drawString("G", 544, 155);
		g.drawOval(539, 141, 18, 18);
		// Voie 102
		g.drawString("V102", 965, 155);
		g.drawString("B", 1002, 155);
		g.drawOval(997, 141, 18, 18);
		// Voie ST1231
		g.drawString("A", 1176, 155);
		g.drawOval(1170, 141, 18, 18);
		// Voie 14
		g.drawString("V14", 40, 205);
		g.drawString("N", 145, 205);
		g.drawOval(140, 191, 18, 18);
		// Voie 11
		g.drawString("V11", 520, 205);
		g.drawString("H", 549, 205);
		g.drawOval(544, 191, 18, 18);
		// Voie 16-17
		g.drawString("V16-17", 1145, 205);
		g.drawString("C", 1110, 205);
		g.drawOval(1105, 191, 18, 18);
		// Voie 12
		g.drawString("V12", 520, 255);
		g.drawString("I", 552, 255);
		g.drawString("K", 400, 255);
		g.drawOval(544, 241, 18, 18);
		g.drawOval(395, 241, 18, 18);
		// Voie 15
		g.drawString("V15", 880, 255);
		g.drawString("E", 935, 255);
		g.drawOval(930, 241, 18, 18);
		// Voie 13
		g.drawString("V13", 520, 305);
		g.drawString("J", 550, 305);
		g.drawOval(544, 291, 18, 18);
	}
	
	/**
	 * Zeichnen der statischen Weichenelemente (Weichennummer)
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneStatischeWeichenElemente(Graphics g) {
		g.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 11));
		g.setColor(Color.DARK_GRAY);

		// Aig. 1
		g.drawString("1", 860, 146);
		// Aig. 2
		g.drawString("2", 827, 202);
		// Aig. 3
		g.drawString("3", 750, 165);
		// Aig. 4
		g.drawString("4", 730, 96);
		// Aig. 5
		g.drawString("5", 740, 246);
		// Aig. 6
		g.drawString("6", 670, 265);
		// Aig. 7
		g.drawString("7", 390, 96);
		// Aig. 8
		g.drawString("8", 370, 165);
		// Aig. 9
		g.drawString("9", 310, 146);
		// Aig. 10
		g.drawString("10", 342, 215);
		// Aig. 110
		g.drawString("110", 300, 196);
		// Aig. 11
		g.drawString("11", 430, 246);
		// Aig. 12
		g.drawString("12", 1040, 196);
	}

	/**
	 * Zeichnen der Chevrons bei den Gruppenausfahrten
	 * 
	 * @param g Der Grafik-Kontext
	 * @see #zeichneChevronUeberGleis(int, int, Graphics)
	 * @see #zeichneChevronUnterGleis(int, int, Graphics)
	 */
	private void zeichneChevrons(Graphics g) {
		// Chevron Voie 11
		zeichneChevronUeberGleis(622, 200, g);
		zeichneChevronUnterGleis(377, 200, g);
		// Chevron Voie 12
		zeichneChevronUeberGleis(622, 250, g);
		zeichneChevronUnterGleis(467, 250, g);
		// Chevron Voie 13
		zeichneChevronUeberGleis(622, 300, g);
		zeichneChevronUnterGleis(467, 300, g);
	}
	
	/**
	 * Zeichnen der Chevrons in Fahrtrichtung "impair" (ueber dem Gleis)
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneChevronUeberGleis(int startX, int startY, Graphics g) {
		g.setColor(Color.BLACK);
		g.drawLine(startX, startY + 3, startX, startY - 9);
		g.drawLine(startX, startY - 9, startX + 10, startY - 9);
		g.drawRect(startX + 10, startY - 14, 10, 10);
		g.drawLine(startX + 12, startY - 14, startX + 17, startY - 9);
		g.drawLine(startX + 17, startY - 9, startX + 12, startY - 4);
	}
	
	/**
	 * Zeichnen der Chevrons in Fahrtrichtung "pair" (unter dem Gleis)
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneChevronUnterGleis(int startX, int startY, Graphics g) {
		g.setColor(Color.BLACK);
		g.drawLine(startX, startY, startX, startY + 12);
		g.drawLine(startX, startY + 12, startX - 10, startY + 12);
		g.drawRect(startX - 20, startY + 7, 10, 10);
		g.drawLine(startX - 12, startY + 17, startX - 17, startY + 12);
		g.drawLine(startX - 17, startY + 12, startX - 12, startY + 7);
	}
	
	/**
	 * Zeichnen der statischen Texte und Beschriftungen
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneStatischeTexte(Graphics g) {
		g.setColor(Color.BLACK);

		g.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 10));
		g.drawString("Annonce", WINDOW_SIZE_WIDTH - 80, 100);
		
		g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 11));
		g.drawString("MARTINSTEIN", WINDOW_SIZE_WIDTH - 90, 165);
		
		g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 12));
		g.drawString("B.V.", 595, 90);
		if (main.isSperreAktiv()) {
			g.setColor(Color.RED);
		}
		g.drawString("CHATEAUPRIX", 650, 370);
	}

	/**
	 * Zeichnen der Bahnsteige
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneBahnsteige(Graphics g) {
		g.setColor(Color.BLACK);
		
		// Voie 2
		g.drawRect(570, 75, 70, 20);
		// Voie 1
		g.drawRect(570, 130, 70, 15);
	}
	
	/**
	 * Zeichnen der extra Linie fuer das Signal <code>Cv12</code> bis nach Gleis 11
	 * 
	 * @param g Der Grafik-Kontext
	 */
	private void zeichneExtraLinieCv12(Graphics g) {
		g.setColor(Color.BLACK);
		g.drawLine(377, 250, 377, 200);
	}
}
